package top.hekun.study.agent;

import top.hekun.study.asm.AsmDemo;

import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

/**
 * @Author: 贺坤
 * @Date: 2023/4/20 9:02
 */
public class AgentPremainTransformer implements ClassFileTransformer {
    /**
     * @param loader              类加载器
     * @param className           完全限定类的内部形式的类的名称
     * @param classBeingRedefined 如果这是由重新定义或重新转换触发的，则类被重新定义或再转换；如果这是一个类加载，则为null
     * @param protectionDomain    正在定义或重新定义的类的保护域
     * @param classfileBuffer     类文件格式的输入字节缓冲区-不得修改
     *
     * @return 格式良好的类文件缓冲区（转换的结果），如果不执行转换返回null
     *
     * @throws IllegalClassFormatException 如果输入不表示格式良好的类文件
     */
    @Override
    public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
//        System.out.println("类加载器(" + loader + ")准备加载类: >> " + className);
        // 当加载 指定的类的时候调用ASM更改内容
        if (className.equals("top/hekun/study/agent/model/DemoUser")) {
            System.out.println("准备修改  DemoUser  >> " + className);
            // 得到一个asm示例
            AsmDemo asmDemo = new AsmDemo(classfileBuffer);
            // 得到返回的class字节码
            return asmDemo.getClassByte();
        }
        return classfileBuffer;
    }
}
